package cn.zwz.modules.tel.utils;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import org.apache.poi.ss.formula.functions.T;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Irving
 * @create 2021/6/19
 * @desc
 **/
public class ExcelListener extends AnalysisEventListener<T> {

    /**
     * 每隔5条存储数据库，实际使用中可以3000条，然后清理list ，方便内存回收
     */
    private static final int BATCH_COUNT = 5;
    List<T> list = new ArrayList<T>(5);

    /**
     * 该方法每读取一条数据都会被调用
     *
     * @param excelFile
     * @param analysisContext
     */
    @Override
    public void invoke(T excelFile, AnalysisContext analysisContext) {
        //把数据缓存到list中
        list.add(excelFile);
        //每5条数据存储一次数据库，这里使用save方法进行存储模拟
        if (list.size() > BATCH_COUNT) {
            save();
        }
    }

    /**
     * excel读取完毕后执行
     *
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        //list中可能会遗留一些数据，当list的size小于5就不会执行invoke中的save，这里在读取完毕后再执行一次save，这样就可以保证数据不会遗留
        save();
    }

    /**
     * 模拟数据库插入
     */
    public void save() {
        for (T excelFields : list) {
            System.out.println(excelFields);
        }
        //循环插入完毕后清除list，节约内存
        if (0 != list.size()) {
            list.clear();
        }
    }

}
